#include <iostream>
#include <fstream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <deque>
#include <ctime>
#include <cstdlib>

using namespace std;

#define sz(x) ((int)((x).size()))

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

const double EPS = 1e-9;
const double PI = acos(-1.0);

const int MAXN = 2050;

int n;
vector<int> g[2 * MAXN];
vector<int> gr[2 * MAXN];
vector<int> o;
int id[2 * MAXN], cc;
bool u[2 * MAXN];

void go(int v) {
	if (u[v])
		return;
	u[v] = true;
	for (int i = 0; i < sz(gr[v]); i++) {
		go(gr[v][i]);
	}
	o.push_back(v);
}

void go2(int v) {
	if (u[v])
		return;
	u[v] = true;
	id[v] = cc;
	for (int i = 0; i < sz(g[v]); i++) {
		go2(g[v][i]);
	}
}

int mt[2050];

int main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);

	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int k;
		scanf("%d", &k);
		while (k-- > 0) {
			int to;
			scanf("%d", &to);
			--to;
			g[i].push_back(n + to);
			gr[i].push_back(n + to);
			g[n + to].push_back(i);
			gr[n + to].push_back(i);
		}
	}
	for (int i = 0; i < n; i++) {
		int x;
		scanf("%d", &x);
		--x;
		mt[i] = x;
	}
	for (int i = 0; i < n; i++) {
		if (!u[i]) {
			go(i);
		}
	}
	for (int i = 0; i < n; i++) {
		u[i] = false;
	}
	cc = 0;
	for (int i = n - 1; i >= 0; --i) {
		int v = o[i];
		if (!u[v]) {
			cc++;
			go2(v);
		}
	}
	for (int i = 0; i < n; i++) {
		vector<int> ans;
		bool flag = false;
		for (int j = 0; j < sz(g[i]); j++) {
			if (id[i] == id[g[i][j]]) {
				if (g[i][j] - n == mt[i])
					flag = true;
				ans.push_back(g[i][j] - n);
			}
		}
		if (!flag) {
			ans.push_back(mt[i]);
		}
		sort(ans.begin(), ans.end());
		printf("%d", sz(ans));
		for (int j = 0; j < sz(ans); j++) {
			printf(" %d", ans[j] + 1);
		}
		puts("");
	}

	return 0;
}
